/**

 * Created by sunchenglin on 2017/7/1.

 */
public class Solution {
    /*如果数组中只有一个数字只出现1次，将数组中的数字进行异或操作，最终可得到该数字。

       第一步：对所有数据异或操作，得到a,及其最低位的1所在位置index。

       第二步：遍历数据，将每个数据 & 2^index， 对结果分组，0为一组，1为一组。

       第三步：0组的数据亦或操作，得到一个数字; 1组的数据亦或操作，得到另一个数字

    * */
    //num1,num2分别为长度为1的数组。传出参数


//将num1[0],num2[0]设置为返回结果


    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
        int a=0,index;
        for(int i=0; i<array.length; i++){
            a ^= array[i];
        }
        index = findFirst1(a);
        for(int i =0; i<array.length; i++){
            if((array[i] & (int)Math.pow(2,index))==0)
                num1[0] ^= array[i];
            else
                num2[0] ^= array[i];
        }
        System.out.println(num1[0]+""+num2[0]);

    }
    public int findFirst1(int a){
        int index = 0;
        //看a的最后一位是否为1

        while( (a&1) == 0){
            a >>= 1;
            index ++;
        }
        return index;
    }
    public static void main(String args[]){

        Solution s = new Solution();
        int a[] = {1,2,3,1,4,4};
        int b[] = {0};
        int c[] = {0};
//        System.out.println(tree.TreeDepth(tree.getRoot()));

        s.FindNumsAppearOnce(a, b, c);
    }
}